/*
 * @Author: wwssaabb
 * @Date: 2021-09-03 17:51:29
 * @LastEditTime: 2021-09-03 18:08:17
 * @FilePath: \handwritten-code\main\instanceof.js
 */

/* 
  instanceof的作用是什么？
    用于检测对象是否为指定构造函数的实例对象，
    也可以用于检测构造函数原型的属性是否出现在实例对象的原型链上
*/

function my_instanceof(instance, Fn) {
  //instance为基本类型都返回false
  if (typeof instance !== 'object' || instance === null) return false

  //获取instance的原型
  let proto=Object.getPrototypeOf(instance)

  //，判断原型上的属性是否出现过，直到找到原型链的尽头null
  while(true){
    if(proto===null)return false  //没找到会一直找到原型链的尽头null
    if(proto===Fn.prototype) return true  //原型和构造函数的原型相等时找到了
    proto=Object.getPrototypeOf(proto)  //沿原型链往下获取原型
  }

}

function Test(){

}
let test={}
let p=new Test()
let p1=Object.create(p)
let p2=Object.create(p1)

console.log(my_instanceof(p2,Test)) //true
console.log(my_instanceof(true,Test)) //false
console.log(my_instanceof(test,Test)) //false



function myInstanceof(instance,fn){
  if(typeof instance !== 'object'&&instance===null)return false
   let proto=Object.getPrototypeOf(instance)
   while(proto){
     if(proto===null)return false
     if(proto===fn)return true
     proto=Object.getPrototypeOf(proto)
   }
}